<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <meta name="generator" content="VuePress 2.0.0-beta.26">
    <link rel="icon" href="/eurynome-cloud/images/logo.png"><link rel="manifest" href="/manifest.webmanifest"><meta name="keywords" content="Eurynome Cloud,微服务,Spring Boot,Spirng Cloud,Spring Cloud Alibaba,Spring Security,OAuth2,Nacos,Skywalking"><script>var _hmt = _hmt || [];
            (function() {
                var hm = document.createElement("script");
                hm.src = "https://hm.baidu.com/hm.js?376190fed0f613f413a39d7aa19f387d";
                var s = document.getElementsByTagName("script")[0];
                s.parentNode.insertBefore(hm, s);
            })();</script><title>OAuth2 | Eurynome Cloud</title><meta name="description" content="Eurynome Cloud, 在线文档, 微服务, 微服务架构, Spring Boot，Spring Cloud，Spring Cloud Alibaba, Spring Security, OAuth 2, Skywalking, Nacos">
    <link rel="preload" href="/eurynome-cloud/assets/js/runtime~app.be772053.js" as="script"><link rel="preload" href="/eurynome-cloud/assets/css/styles.d9dc5387.css" as="style"><link rel="preload" href="/eurynome-cloud/assets/js/287.4d31e5fd.js" as="script"><link rel="preload" href="/eurynome-cloud/assets/js/app.c0fb808e.js" as="script">
    <link rel="stylesheet" href="/eurynome-cloud/assets/css/styles.d9dc5387.css">
  </head>
  <body>
    <div id="app"><!--[--><div class="theme-container"><!--[--><header class="navbar"><div class="toggle-sidebar-button" title="toggle sidebar" aria-expanded="false" role="button" tabindex="0"><div class="icon" aria-hidden="true"><span></span><span></span><span></span></div></div><span><a href="/eurynome-cloud/" class=""><img class="logo" src="/eurynome-cloud/images/logo.png" alt="Eurynome Cloud"><span class="site-name can-hide">Eurynome Cloud</span></a></span><div class="navbar-links-wrapper" style=""><!--[--><!--]--><nav class="navbar-links can-hide"><!--[--><div class="navbar-links-item"><a href="/eurynome-cloud/documents/" class="nav-link" aria-label="指南"><!--[--><!--]--> 指南 <!--[--><!--]--></a></div><div class="navbar-links-item"><a href="/eurynome-cloud/configurations/" class="nav-link" aria-label="配置参考"><!--[--><!--]--> 配置参考 <!--[--><!--]--></a></div><div class="navbar-links-item"><a href="/eurynome-cloud/documents-athena/" class="nav-link" aria-label="单体版"><!--[--><!--]--> 单体版 <!--[--><!--]--></a></div><div class="navbar-links-item"><a href="/eurynome-cloud/microservices/" class="nav-link router-link-active" aria-label="微服务技术栈"><!--[--><!--]--> 微服务技术栈 <!--[--><!--]--></a></div><div class="navbar-links-item"><div class="dropdown-wrapper"><button class="dropdown-title" type="button" aria-label="了解更多"><span class="title">了解更多</span><span class="arrow down"></span></button><button class="mobile-dropdown-title" type="button" aria-label="了解更多"><span class="title">了解更多</span><span class="right arrow"></span></button><!--[--><ul style="display:none;" class="nav-dropdown"><!--[--><li class="dropdown-item"><!--[--><h4 class="dropdown-subtitle"><span>延伸</span></h4><ul class="dropdown-subitem-wrapper"><!--[--><li class="dropdown-subitem"><a href="/eurynome-cloud/basic-knowledge/" class="nav-link" aria-label="了解基础知识"><!--[--><!--]--> 了解基础知识 <!--[--><!--]--></a></li><li class="dropdown-subitem"><a href="/eurynome-cloud/basic-knowledge/postgresql.md" class="nav-link" aria-label="了解PostgreSQL"><!--[--><!--]--> 了解PostgreSQL <!--[--><!--]--></a></li><!--]--></ul><!--]--></li><li class="dropdown-item"><!--[--><h4 class="dropdown-subtitle"><span>帮助</span></h4><ul class="dropdown-subitem-wrapper"><!--[--><li class="dropdown-subitem"><a class="nav-link external" href="https://gitee.com/herodotus/eurynome-cloud/issues" rel="noopener noreferrer" target="_blank" aria-label="我要提问"><!--[--><!--]--> 我要提问 <span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span><!--[--><!--]--></a></li><li class="dropdown-subitem"><a href="/eurynome-cloud/others/README.md" class="nav-link" aria-label="常见问题"><!--[--><!--]--> 常见问题 <!--[--><!--]--></a></li><li class="dropdown-subitem"><a href="/eurynome-cloud/others/更新日志.md" class="nav-link" aria-label="更新日志"><!--[--><!--]--> 更新日志 <!--[--><!--]--></a></li><li class="dropdown-subitem"><a class="nav-link external" href="https://jq.qq.com/?_wv=1027&amp;k=bIerJVy8" rel="noopener noreferrer" target="_blank" aria-label="加入QQ群"><!--[--><!--]--> 加入QQ群 <span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span><!--[--><!--]--></a></li><!--]--></ul><!--]--></li><!--]--></ul><!--]--></div></div><div class="navbar-links-item"><div class="dropdown-wrapper"><button class="dropdown-title" type="button" aria-label="Gitee"><span class="title">Gitee</span><span class="arrow down"></span></button><button class="mobile-dropdown-title" type="button" aria-label="Gitee"><span class="title">Gitee</span><span class="right arrow"></span></button><!--[--><ul style="display:none;" class="nav-dropdown"><!--[--><li class="dropdown-item"><a class="nav-link external" href="https://gitee.com/herodotus/eurynome-cloud" rel="noopener noreferrer" target="_blank" aria-label="后端源码"><!--[--><!--]--> 后端源码 <span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span><!--[--><!--]--></a></li><li class="dropdown-item"><a class="nav-link external" href="https://gitee.com/herodotus/eurynome-cloud-ui" rel="noopener noreferrer" target="_blank" aria-label="前端源码"><!--[--><!--]--> 前端源码 <span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span><!--[--><!--]--></a></li><li class="dropdown-item"><a class="nav-link external" href="https://gitee.com/herodotus/herodotus-cloud-athena" rel="noopener noreferrer" target="_blank" aria-label="单体版源码"><!--[--><!--]--> 单体版源码 <span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span><!--[--><!--]--></a></li><!--]--></ul><!--]--></div></div><div class="navbar-links-item"><div class="dropdown-wrapper"><button class="dropdown-title" type="button" aria-label="Github"><span class="title">Github</span><span class="arrow down"></span></button><button class="mobile-dropdown-title" type="button" aria-label="Github"><span class="title">Github</span><span class="right arrow"></span></button><!--[--><ul style="display:none;" class="nav-dropdown"><!--[--><li class="dropdown-item"><a class="nav-link external" href="https://github.com/herodotus-cloud/eurynome-cloud" rel="noopener noreferrer" target="_blank" aria-label="后端源码"><!--[--><!--]--> 后端源码 <span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span><!--[--><!--]--></a></li><li class="dropdown-item"><a class="nav-link external" href="https://github.com/herodotus-cloud/eurynome-cloud-ui" rel="noopener noreferrer" target="_blank" aria-label="前端源码"><!--[--><!--]--> 前端源码 <span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span><!--[--><!--]--></a></li><li class="dropdown-item"><a class="nav-link external" href="https://github.com/herodotus-cloud/herodotus-cloud-athena" rel="noopener noreferrer" target="_blank" aria-label="单体版源码"><!--[--><!--]--> 单体版源码 <span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span><!--[--><!--]--></a></li><!--]--></ul><!--]--></div></div><!--]--></nav><!--[--><!--]--><button class="toggle-dark-button" title="toggle dark mode"><svg style="" class="icon" focusable="false" viewBox="0 0 32 32"><path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path></svg><svg style="display:none;" class="icon" focusable="false" viewBox="0 0 32 32"><path d="M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z" fill="currentColor"></path></svg></button><form class="search-box" role="search"><input type="search" placeholder="搜索" autocomplete="off" spellcheck="false" value><!----></form></div></header><!--]--><div class="sidebar-mask"></div><!--[--><aside class="sidebar"><nav class="navbar-links"><!--[--><div class="navbar-links-item"><a href="/eurynome-cloud/documents/" class="nav-link" aria-label="指南"><!--[--><!--]--> 指南 <!--[--><!--]--></a></div><div class="navbar-links-item"><a href="/eurynome-cloud/configurations/" class="nav-link" aria-label="配置参考"><!--[--><!--]--> 配置参考 <!--[--><!--]--></a></div><div class="navbar-links-item"><a href="/eurynome-cloud/documents-athena/" class="nav-link" aria-label="单体版"><!--[--><!--]--> 单体版 <!--[--><!--]--></a></div><div class="navbar-links-item"><a href="/eurynome-cloud/microservices/" class="nav-link router-link-active" aria-label="微服务技术栈"><!--[--><!--]--> 微服务技术栈 <!--[--><!--]--></a></div><div class="navbar-links-item"><div class="dropdown-wrapper"><button class="dropdown-title" type="button" aria-label="了解更多"><span class="title">了解更多</span><span class="arrow down"></span></button><button class="mobile-dropdown-title" type="button" aria-label="了解更多"><span class="title">了解更多</span><span class="right arrow"></span></button><!--[--><ul style="display:none;" class="nav-dropdown"><!--[--><li class="dropdown-item"><!--[--><h4 class="dropdown-subtitle"><span>延伸</span></h4><ul class="dropdown-subitem-wrapper"><!--[--><li class="dropdown-subitem"><a href="/eurynome-cloud/basic-knowledge/" class="nav-link" aria-label="了解基础知识"><!--[--><!--]--> 了解基础知识 <!--[--><!--]--></a></li><li class="dropdown-subitem"><a href="/eurynome-cloud/basic-knowledge/postgresql.md" class="nav-link" aria-label="了解PostgreSQL"><!--[--><!--]--> 了解PostgreSQL <!--[--><!--]--></a></li><!--]--></ul><!--]--></li><li class="dropdown-item"><!--[--><h4 class="dropdown-subtitle"><span>帮助</span></h4><ul class="dropdown-subitem-wrapper"><!--[--><li class="dropdown-subitem"><a class="nav-link external" href="https://gitee.com/herodotus/eurynome-cloud/issues" rel="noopener noreferrer" target="_blank" aria-label="我要提问"><!--[--><!--]--> 我要提问 <span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span><!--[--><!--]--></a></li><li class="dropdown-subitem"><a href="/eurynome-cloud/others/README.md" class="nav-link" aria-label="常见问题"><!--[--><!--]--> 常见问题 <!--[--><!--]--></a></li><li class="dropdown-subitem"><a href="/eurynome-cloud/others/更新日志.md" class="nav-link" aria-label="更新日志"><!--[--><!--]--> 更新日志 <!--[--><!--]--></a></li><li class="dropdown-subitem"><a class="nav-link external" href="https://jq.qq.com/?_wv=1027&amp;k=bIerJVy8" rel="noopener noreferrer" target="_blank" aria-label="加入QQ群"><!--[--><!--]--> 加入QQ群 <span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span><!--[--><!--]--></a></li><!--]--></ul><!--]--></li><!--]--></ul><!--]--></div></div><div class="navbar-links-item"><div class="dropdown-wrapper"><button class="dropdown-title" type="button" aria-label="Gitee"><span class="title">Gitee</span><span class="arrow down"></span></button><button class="mobile-dropdown-title" type="button" aria-label="Gitee"><span class="title">Gitee</span><span class="right arrow"></span></button><!--[--><ul style="display:none;" class="nav-dropdown"><!--[--><li class="dropdown-item"><a class="nav-link external" href="https://gitee.com/herodotus/eurynome-cloud" rel="noopener noreferrer" target="_blank" aria-label="后端源码"><!--[--><!--]--> 后端源码 <span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span><!--[--><!--]--></a></li><li class="dropdown-item"><a class="nav-link external" href="https://gitee.com/herodotus/eurynome-cloud-ui" rel="noopener noreferrer" target="_blank" aria-label="前端源码"><!--[--><!--]--> 前端源码 <span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span><!--[--><!--]--></a></li><li class="dropdown-item"><a class="nav-link external" href="https://gitee.com/herodotus/herodotus-cloud-athena" rel="noopener noreferrer" target="_blank" aria-label="单体版源码"><!--[--><!--]--> 单体版源码 <span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span><!--[--><!--]--></a></li><!--]--></ul><!--]--></div></div><div class="navbar-links-item"><div class="dropdown-wrapper"><button class="dropdown-title" type="button" aria-label="Github"><span class="title">Github</span><span class="arrow down"></span></button><button class="mobile-dropdown-title" type="button" aria-label="Github"><span class="title">Github</span><span class="right arrow"></span></button><!--[--><ul style="display:none;" class="nav-dropdown"><!--[--><li class="dropdown-item"><a class="nav-link external" href="https://github.com/herodotus-cloud/eurynome-cloud" rel="noopener noreferrer" target="_blank" aria-label="后端源码"><!--[--><!--]--> 后端源码 <span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span><!--[--><!--]--></a></li><li class="dropdown-item"><a class="nav-link external" href="https://github.com/herodotus-cloud/eurynome-cloud-ui" rel="noopener noreferrer" target="_blank" aria-label="前端源码"><!--[--><!--]--> 前端源码 <span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span><!--[--><!--]--></a></li><li class="dropdown-item"><a class="nav-link external" href="https://github.com/herodotus-cloud/herodotus-cloud-athena" rel="noopener noreferrer" target="_blank" aria-label="单体版源码"><!--[--><!--]--> 单体版源码 <span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span><!--[--><!--]--></a></li><!--]--></ul><!--]--></div></div><!--]--></nav><!--[--><!--]--><ul class="sidebar-links"><!--[--><!--[--><p class="sidebar-heading sidebar-item active">微服务技术栈</p><ul class=""><li><!--[--><a href="/eurynome-cloud/microservices/" class="nav-link router-link-active sidebar-item" aria-label="介绍"><!--[--><!--]--> 介绍 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/eurynome-cloud/microservices/OAuth2%E6%8E%88%E6%9D%83%E6%A0%87%E5%87%86.html" class="router-link-active router-link-exact-active nav-link router-link-active sidebar-item active" aria-label="OAuth2"><!--[--><!--]--> OAuth2 <!--[--><!--]--></a><ul class="sidebar-sub-items"><li><!--[--><a aria-current="page" href="/eurynome-cloud/microservices/OAuth2%E6%8E%88%E6%9D%83%E6%A0%87%E5%87%86.html#介绍" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="介绍"><!--[--><!--]--> 介绍 <!--[--><!--]--></a><ul class="sidebar-sub-items"><li><!--[--><a aria-current="page" href="/eurynome-cloud/microservices/OAuth2%E6%8E%88%E6%9D%83%E6%A0%87%E5%87%86.html#oauth2授权流程中的角色" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="OAuth2授权流程中的角色"><!--[--><!--]--> OAuth2授权流程中的角色 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/eurynome-cloud/microservices/OAuth2%E6%8E%88%E6%9D%83%E6%A0%87%E5%87%86.html#令牌与密码" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="令牌与密码"><!--[--><!--]--> 令牌与密码 <!--[--><!--]--></a><!----><!--]--></li></ul><!--]--></li><li><!--[--><a aria-current="page" href="/eurynome-cloud/microservices/OAuth2%E6%8E%88%E6%9D%83%E6%A0%87%E5%87%86.html#四种模式" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="四种模式"><!--[--><!--]--> 四种模式 <!--[--><!--]--></a><ul class="sidebar-sub-items"><li><!--[--><a aria-current="page" href="/eurynome-cloud/microservices/OAuth2%E6%8E%88%E6%9D%83%E6%A0%87%E5%87%86.html#授权码模式-authorization-code-grant" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="授权码模式（Authorization Code Grant）"><!--[--><!--]--> 授权码模式（Authorization Code Grant） <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/eurynome-cloud/microservices/OAuth2%E6%8E%88%E6%9D%83%E6%A0%87%E5%87%86.html#隐式模式-implicit-grant" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="隐式模式（Implicit Grant）"><!--[--><!--]--> 隐式模式（Implicit Grant） <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/eurynome-cloud/microservices/OAuth2%E6%8E%88%E6%9D%83%E6%A0%87%E5%87%86.html#密码模式-resource-owner-password-credentials-grant" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="密码模式（Resource Owner Password Credentials Grant）"><!--[--><!--]--> 密码模式（Resource Owner Password Credentials Grant） <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/eurynome-cloud/microservices/OAuth2%E6%8E%88%E6%9D%83%E6%A0%87%E5%87%86.html#客户端凭证模式-client-credentials-grant" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="客户端凭证模式（Client Credentials Grant）"><!--[--><!--]--> 客户端凭证模式（Client Credentials Grant） <!--[--><!--]--></a><!----><!--]--></li></ul><!--]--></li><li><!--[--><a aria-current="page" href="/eurynome-cloud/microservices/OAuth2%E6%8E%88%E6%9D%83%E6%A0%87%E5%87%86.html#模式验证" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="模式验证"><!--[--><!--]--> 模式验证 <!--[--><!--]--></a><ul class="sidebar-sub-items"><li><!--[--><a aria-current="page" href="/eurynome-cloud/microservices/OAuth2%E6%8E%88%E6%9D%83%E6%A0%87%E5%87%86.html#授权码模式验证" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="授权码模式验证"><!--[--><!--]--> 授权码模式验证 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/eurynome-cloud/microservices/OAuth2%E6%8E%88%E6%9D%83%E6%A0%87%E5%87%86.html#隐式模式验证" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="隐式模式验证"><!--[--><!--]--> 隐式模式验证 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/eurynome-cloud/microservices/OAuth2%E6%8E%88%E6%9D%83%E6%A0%87%E5%87%86.html#密码模式验证" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="密码模式验证"><!--[--><!--]--> 密码模式验证 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/eurynome-cloud/microservices/OAuth2%E6%8E%88%E6%9D%83%E6%A0%87%E5%87%86.html#客户端凭证模式验证" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="客户端凭证模式验证"><!--[--><!--]--> 客户端凭证模式验证 <!--[--><!--]--></a><!----><!--]--></li></ul><!--]--></li></ul><!--]--></li><li><!--[--><a href="/eurynome-cloud/microservices/%E5%AE%B9%E5%99%A8%E5%8C%96%E6%8A%80%E6%9C%AF.html" class="nav-link sidebar-item" aria-label="容器化技术"><!--[--><!--]--> 容器化技术 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a href="/eurynome-cloud/microservices/%E5%AE%B9%E5%99%A8%E5%8C%96%E9%83%A8%E7%BD%B2.html" class="nav-link sidebar-item" aria-label="容器化部署"><!--[--><!--]--> 容器化部署 <!--[--><!--]--></a><!----><!--]--></li></ul><!--]--><!--]--></ul><!--[--><!--]--></aside><!--]--><!--[--><main class="page"><!--[--><!--]--><div class="theme-default-content"><!--[--><h1 id="oauth2" tabindex="-1"><a class="header-anchor" href="#oauth2" aria-hidden="true">#</a> OAuth2</h1><h2 id="介绍" tabindex="-1"><a class="header-anchor" href="#介绍" aria-hidden="true">#</a> 介绍</h2><p><code>OAuth</code> 全称是 <code>Open Authentication</code></p><p>开放授权（<code>OAuth</code>）是一个开放标准，允许用户让第三方应用访问该用户在某一网站上存储的私密的资源（如照片，视频，联系人列表），而无需将用户名和密码提供给第三方应用。 OAuth允许用户提供一个令牌，而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站（例如，视频编辑网站）在特定的时段（例如，接下来的2小时内）内访问特定的资源（例如仅仅是某一相册中的视频）。这样，<code>OAuth</code> 让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息，而非所有内容。</p><blockquote><p>目前使用最广泛的是 <code>OAuth 2.0</code>，<code>OAuth 1.0</code> 已经被废弃了。本文中的OAuth都是指 <code>OAuth 2.0</code></p></blockquote><h3 id="oauth2授权流程中的角色" tabindex="-1"><a class="header-anchor" href="#oauth2授权流程中的角色" aria-hidden="true">#</a> OAuth2授权流程中的角色</h3><ul><li>资源拥有者（<code>resource owner</code>）：能授权访问受保护资源的一个实体，可以是一个人，那我们称之为最终用户；</li><li>资源服务器（<code>resource server</code>）：存储受保护资源，客户端通过<code>access token</code>请求资源，资源服务器响应受保护资源给客户端；</li><li>授权服务器（<code>authorization server</code>）：成功验证资源拥有者并获取授权之后，授权服务器颁发授权令牌（<code>Access Token</code>）给客户端。</li><li>客户端（<code>client</code>）：第三方应用，也可以是它自己的官方应用；其本身不存储资源，而是资源拥有者授权通过后，使用它的授权（授权令牌）访问受保护资源，然后客户端把相应的数据展示出来/提交到服务器。</li></ul><h3 id="令牌与密码" tabindex="-1"><a class="header-anchor" href="#令牌与密码" aria-hidden="true">#</a> 令牌与密码</h3><p>令牌（<code>token</code>）与密码（<code>password</code>）的作用是一样的，都可以进入系统，但是有三点差异。</p><ul><li>（1）令牌是短期的，到期会自动失效，用户自己无法修改。密码一般长期有效，用户不修改，就不会发生变化。</li><li>（2）令牌可以被数据所有者撤销，会立即失效。以上例而言，屋主可以随时取消快递员的令牌。密码一般不允许被他人撤销。</li><li>（3）令牌有权限范围（scope），比如只能进小区的二号门。对于网络服务来说，只读令牌就比读写令牌更安全。密码一般是完整权限。</li></ul><p>上面这些设计，保证了令牌既可以让第三方应用获得权限，同时又随时可控，不会危及系统安全。这就是 <code>OAuth 2.0</code> 的优点。</p><div class="custom-container danger"><p class="custom-container-title">注意</p><p>只要知道了令牌，就能进入系统。系统一般不会再次确认身份，所以令牌必须保密，泄漏令牌与泄漏密码的后果是一样的。 这也是为什么令牌的有效期，一般都设置得很短的原因。</p></div><h2 id="四种模式" tabindex="-1"><a class="header-anchor" href="#四种模式" aria-hidden="true">#</a> 四种模式</h2><p><code>OAuth</code> 的核心就是向第三方应用颁发令牌。<code>OAuth 2.0</code> 协议根据使用不同的适用场景，规定了四种获得令牌的流程。你可以选择最适合自己的那一种，向第三方应用颁发令牌。下面就是这四种授权方式。</p><ul><li>授权码模式（<code>Authorization Code Grant</code>）</li><li>隐式模式（<code>Implicit Grant</code>）</li><li>密码模式式（<code>Resource Owner Password Credentials Grant</code>）：</li><li>客户端凭证模式（<code>Client Credentials Grant</code>）</li></ul><h3 id="授权码模式-authorization-code-grant" tabindex="-1"><a class="header-anchor" href="#授权码模式-authorization-code-grant" aria-hidden="true">#</a> 授权码模式（Authorization Code Grant）</h3><p>授权码授权模式主要流程如下图所示：</p><p><img src="/eurynome-cloud/images/oauth/authorization-code-flow.png" alt="授权码模式流程"></p><ul><li>第一步：用户访问页面或者出发认证地址</li><li>第二步：访问的页面将请求重定向到认证服务器</li><li>第三步：用户登录成功只有，认证服务器向用户展示授权页面，等待用户授权</li><li>第四步：用户授权，认证服务器生成一个 <code>code</code> 和带上 <code>client_id</code> 发送给应用服务器。然后，应用服务器拿到 <code>code</code>，并用 <code>client_id</code> 去后台查询对应的<code>client_secret</code></li><li>第五步：将 <code>code</code>、<code>client_id</code>、<code>client_secret</code>传给认证服务器换取 <code>access_token</code> 和 <code>refresh_token</code></li><li>第六步：将 <code>access_token</code> 和 <code>refresh_token</code> 传给应用服务器</li><li>第七步：验证 <code>token</code>，访问真正的资源页面</li></ul><div class="custom-container tip"><p class="custom-container-title">授权码授权模式优劣势：</p><p><img src="/eurynome-cloud/images/oauth/authorization-code-description.png" alt="授权码模式优劣势"></p></div><h3 id="隐式模式-implicit-grant" tabindex="-1"><a class="header-anchor" href="#隐式模式-implicit-grant" aria-hidden="true">#</a> 隐式模式（Implicit Grant）</h3><p>隐式模式主要流程如下图所示：</p><p><img src="/eurynome-cloud/images/oauth/implicit-grant-flow.png" alt="隐式模式流程"></p><ul><li>第一步：用户访问页面时，重定向到认证服务器。</li><li>第二步：认证服务器给用户一个认证页面，等待用户授权。</li><li>第三步：用户授权，认证服务器想应用页面返回 <code>Token</code></li><li>第四步：验证 <code>Token</code>，访问真正的资源页面</li></ul><div class="custom-container tip"><p class="custom-container-title">隐式模式优劣势:</p><p><img src="/eurynome-cloud/images/oauth/implicit-grant-description.png" alt="隐式模式优劣势"></p></div><h3 id="密码模式-resource-owner-password-credentials-grant" tabindex="-1"><a class="header-anchor" href="#密码模式-resource-owner-password-credentials-grant" aria-hidden="true">#</a> 密码模式（Resource Owner Password Credentials Grant）</h3><p>密码模式主要流程如下图所示：</p><p><img src="/eurynome-cloud/images/oauth/resource-owner-password-credentials-grant-flow.png" alt="密码流程"></p><ul><li>第一步：用户访问用页面时，输入第三方认证所需要的信息(QQ/微信账号密码)</li><li>第二步：应用页面那种这个信息去认证服务器授权</li><li>第三步：认证服务器授权通过，拿到token，访问真正的资源页面</li></ul><div class="custom-container tip"><p class="custom-container-title">说明</p><p>优点：不需要多次请求转发，额外开销，同时可以获取更多的用户信息。(都拿到账号密码了)</p><p>缺点：局限性，认证服务器和应用方必须有超高的信赖。(比如亲兄弟？)</p><p><strong>应用场景：自家公司搭建的认证服务器</strong></p></div><h3 id="客户端凭证模式-client-credentials-grant" tabindex="-1"><a class="header-anchor" href="#客户端凭证模式-client-credentials-grant" aria-hidden="true">#</a> 客户端凭证模式（Client Credentials Grant）</h3><p>客户端凭证模式主要流程如下图所示：</p><p><img src="/eurynome-cloud/images/oauth/client-credentials-grant-flow.png" alt="客户端凭证流程"></p><ul><li>第一步：用户访问应用客户端</li><li>第二步：通过客户端定义的验证方法，拿到token，无需授权</li><li>第三步：访问资源服务器A</li><li>第四步：拿到一次token就可以畅通无阻的访问其他的资源页面。</li></ul><div class="custom-container tip"><p class="custom-container-title">说明</p><p>这是一种最简单的模式，只要client请求，我们就将AccessToken发送给它。这种模式是最方便但最不安全的模式。因此这就要求我们对client完全的信任，而client本身也是安全的。</p><p><strong>因此这种模式一般用来提供给我们完全信任的服务器端服务。在这个过程中不需要用户的参与。</strong></p></div><h2 id="模式验证" tabindex="-1"><a class="header-anchor" href="#模式验证" aria-hidden="true">#</a> 模式验证</h2><div class="custom-container danger"><p class="custom-container-title">注意</p><p>以下内容中，所有URL地址一定要使用IP访问。如果是本地环境，那么也要使用本机真实的IP，不要使用 <code>127.0.0.1</code> 或者 <code>localhost</code>。切记！！！</p></div><div class="custom-container warning"><p class="custom-container-title">说明</p><p>不管哪一种授权方式，第三方应用申请令牌之前，都必须先到系统备案，说明自己的身份，然后会拿到两个身份识别码：客户端 ID（client ID）和客户端密钥（client secret）。这 是为了防止令牌被滥用，没有备案过的第三方应用，是不会拿到令牌的。</p><p>即：要在系统中为该客户端分配ID（<code>client ID</code>）和客户端密钥（<code>client secret</code>），换句话说 <code>oauth-client-details</code> 表中要有该客户端对应的数据</p></div><h3 id="授权码模式验证" tabindex="-1"><a class="header-anchor" href="#授权码模式验证" aria-hidden="true">#</a> 授权码模式验证</h3><p>指的是第三方应用先申请一个授权码，然后再用该码获取令牌。这种方式是最常用的流程，安全性也最高，它适用于那些有后端的 Web 应用。授权码通过前端传送，令牌则是储存在后端，而且所有与资源服务器的通信都在后端完成。这样的前后端分离，可以避免令牌泄漏。</p><h4 id="第一步-客户端向资源端申请code" tabindex="-1"><a class="header-anchor" href="#第一步-客户端向资源端申请code" aria-hidden="true">#</a> 第一步：客户端向资源端申请code</h4><div class="custom-container tip"><p class="custom-container-title">说明</p><p>这里所说的客户端，是指任意想要使用 <code>Eurynome Cloud</code> 的应用系统。</p><p>主要逻辑：假设，某网站或者系统（客户端），我们称之为 A 。<code>Eurynome Cloud</code> 向A网站提供一个认证链接，A 网站会把这个连接做成一个按钮，用户点击后就会根据这个连接跳转到 <code>Eurynome Cloud</code>，在 <code>Eurynome Cloud</code> 认证通过后授权用户数据给 A 网站使用。</p></div><p>上面所说的连接，就是如下的认证连接：</p><div class="language-url ext-url line-numbers-mode"><pre class="language-url"><code><span class="token scheme">http<span class="token scheme-delimiter">:</span></span><span class="token authority"><span class="token authority-delimiter">//</span><span class="token host">192.168.101.10</span><span class="token port-segment"><span class="token port-delimiter">:</span><span class="token port">8847</span></span></span><span class="token path"><span class="token path-separator">/</span>eurynome-cloud-uaa<span class="token path-separator">/</span>oauth<span class="token path-separator">/</span>authorize</span><span class="token query"><span class="token query-delimiter">?</span><span class="token pair"><span class="token key">response_type</span>=<span class="token value">code</span></span><span class="token pair-delimiter">&amp;</span><span class="token pair"><span class="token key">client_id</span>=<span class="token value">010e659a-4005-4610-98f6-00b822f4758e</span></span><span class="token pair-delimiter">&amp;</span><span class="token pair"><span class="token key">redirect_uri</span>=<span class="token value">http://localhost:9999/passport/login</span></span><span class="token pair-delimiter">&amp;</span><span class="token pair"><span class="token key">scope</span>=<span class="token value">all</span></span></span>
</code></pre><div class="line-numbers"><span class="line-number">1</span><br></div></div><div class="custom-container tip"><p class="custom-container-title">参数</p><ul><li>response_type：必选。值固定为“code”。</li><li>client_id：必选参数（第三方应用的标识ID，告诉服务器谁需要得到授权）</li><li>state：Client提供的一个字符串，服务器会原样返回给Client。这个要自己实现，用于防止恶意攻击。</li><li>redirect_uri：必选参数（授权成功后的重定向地址）</li><li>scope：可选参数（表示授权范围）</li></ul></div><h4 id="第二步-资源端返回code给客户端" tabindex="-1"><a class="header-anchor" href="#第二步-资源端返回code给客户端" aria-hidden="true">#</a> 第二步：资源端返回code给客户端</h4><p>可以采用以下两种方式进行验证：</p><ul><li>第一种：如果有想要接入的系统，那么就在这个系统中做一个图标按钮，点击后跳转到上面的地址。（比如：很多系统都支持微信登录，那么在页面上就会有一个微信的图标按钮，点击后跳转到一个地址）</li><li>第二种：如果没有想接入的系统，可以将上面的地址输入到浏览器，获取信息后配合 <code>Postman</code> 等工具进行验证。</li></ul><blockquote><p>下面采用第二种浏览器的方式</p></blockquote><p>在浏览器中输入上面的地址，会跳出如下登录界面。</p><p><img src="/eurynome-cloud/images/oauth/authorization-code-demo-01.png" alt="流程1"></p><p>输入用户名、密码和验证码进行用户验证。</p><blockquote><p>可以使用系统默认用户：system 密码：123456</p></blockquote><p>登录成功后，会跳转到授权页面进行授权，如下图所示：</p><p><img src="/eurynome-cloud/images/oauth/authorization-code-demo-02.png" alt="流程2"></p><p>授权成功后，就会跳转到一个新的地址，同时在地址的后面会跟随生成的code, 如下所示。这个地址就是系统中设置的 <code>redirect_uri</code></p><div class="language-url ext-url line-numbers-mode"><pre class="language-url"><code><span class="token scheme">http<span class="token scheme-delimiter">:</span></span><span class="token authority"><span class="token authority-delimiter">//</span><span class="token host">localhost</span><span class="token port-segment"><span class="token port-delimiter">:</span><span class="token port">9999</span></span></span><span class="token path"><span class="token path-separator">/</span>passport<span class="token path-separator">/</span>login</span><span class="token query"><span class="token query-delimiter">?</span><span class="token pair"><span class="token key">code</span>=<span class="token value">P6dxH5</span></span></span>
</code></pre><div class="line-numbers"><span class="line-number">1</span><br></div></div><h4 id="第三步-客户端根据code向资源端请求令牌" tabindex="-1"><a class="header-anchor" href="#第三步-客户端根据code向资源端请求令牌" aria-hidden="true">#</a> 第三步：客户端根据code向资源端请求令牌</h4><p>在你习惯的工具中，输入下面的地址：</p><div class="language-url ext-url line-numbers-mode"><pre class="language-url"><code><span class="token scheme">http<span class="token scheme-delimiter">:</span></span><span class="token authority"><span class="token authority-delimiter">//</span><span class="token host">192.168.101.10</span><span class="token port-segment"><span class="token port-delimiter">:</span><span class="token port">8847</span></span></span><span class="token path"><span class="token path-separator">/</span>eurynome-cloud-uaa<span class="token path-separator">/</span>oauth<span class="token path-separator">/</span>token</span><span class="token query"><span class="token query-delimiter">?</span><span class="token pair"><span class="token key">client_id</span>=<span class="token value">010e659a-4005-4610-98f6-00b822f4758e</span></span><span class="token pair-delimiter">&amp;</span><span class="token pair"><span class="token key">client_secret</span>=<span class="token value">04165a07-cffd-45cf-a20a-1c2a69f65fb1</span></span><span class="token pair-delimiter">&amp;</span><span class="token pair"><span class="token key">grant_type</span>=<span class="token value">authorization_code</span></span><span class="token pair-delimiter">&amp;</span><span class="token pair"><span class="token key">code</span>=<span class="token value">P6dxH5</span></span><span class="token pair-delimiter">&amp;</span><span class="token pair"><span class="token key">scope</span>=<span class="token value">all</span></span><span class="token pair-delimiter">&amp;</span><span class="token pair"><span class="token key">redirect_uri</span>=<span class="token value">http://localhost:9999/passport/login</span></span></span>
</code></pre><div class="line-numbers"><span class="line-number">1</span><br></div></div><div class="custom-container tip"><p class="custom-container-title">参数</p><ul><li>grant_type：必选参数（固定值“authorization_code”）</li><li>code : 必选参数（上一步Response 中响应的code，避免在请求的过程中被篡改）</li><li>redirect_uri：必选参数（必须和Request中提供的redirect_uri相同）</li><li>client_id：必选参数（必须和上一步Request中提供的client_id相同，不能token和授权码请求的第三方应用不一致）</li></ul></div><p>下图以 <code>Postman</code> 为例：</p><p><img src="/eurynome-cloud/images/oauth/authorization-code-demo-03.png" alt="流程3"></p><h4 id="第四步-资源端向客户端返回令牌及明细" tabindex="-1"><a class="header-anchor" href="#第四步-资源端向客户端返回令牌及明细" aria-hidden="true">#</a> 第四步：资源端向客户端返回令牌及明细</h4><p>返回如下所示 <code>Token</code> 则表示验证成功</p><div class="language-json ext-json line-numbers-mode"><pre class="language-json"><code><span class="token punctuation">{</span>
    <span class="token property">&quot;access_token&quot;</span><span class="token operator">:</span> <span class="token string">&quot;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsaWNlbnNlIjoiaGVyb2RvdHVzLWNsb3VkIiwidXNlcl9uYW1lIjoic3lzdGVtIiwib3BlbmlkIjoiMSIsInNjb3BlIjpbImFsbCJdLCJleHAiOjE2MzE2NjA5ODQsImF1dGhvcml0aWVzIjpbIk9QXzExNTk4MzkxNzUiLCJPUF8yMDY3MDA2OTYyIiwiT1BfMjAzODgxODY1IiwiT1BfMTgzMTkzMzI1NiIsIk9QXzM0NzEwODY4NCIsIk9QXzE1Mjk0OTk3MzQiLCJPUF8xNzkxNDgyODQwIiwiT1BfNTM5NzkwMTU0IiwiT1BfMTI5MTk4NjQyMCIsIk9QXzQxNDY2NTUwNSIsIk9QXzQ5MDczNzk0IiwiT1BfNzg3NjI3NTU1IiwiT1BfMTczNTYzMTgyNyIsIk9QXzEyNTYzNDY4ODciLCJPUF8xNTk1NjM4NiIsIk9QXzY1NDE2MjAxMSIsIk9QXzE2ODEwMjg3OTEiLCJPUF8xNTM4MzQzNDAiLCJPUF85NTI1NjU1NzAiLCJPUF8xOTg5ODY5MjkxIiwiT1BfMTcxODk4ODQwOCIsIk9QXzEyMTMxODc4MDkiLCJPUF85OTMxNjU1IiwiT1BfNzMwMTA1NDk5IiwiT1BfMTE5ODg3Njk4NSIsIk9QXzMyMjc3NjY4MSIsIk9QXzYyNTQ3MTI0OCIsIk9QXzIwNDA2OTk0NDMiLCJPUF83MzQwODE3MTYiLCJPUF80NTM5MjE4MjUiLCJPUF83MTUxMTUyNzIiLCJPUF82NzI5Mjg4NyIsIk9QXzE2MDM5NTM4NTgiLCJPUF8xNzQzMDQ0MzA1IiwiT1BfOTkzOTYyNDAzIiwiT1BfMTU3ODIxMTczOSIsIk9QXzI1NjIwMTkiLCJPUF8xODQwMDkwOTkyIiwiT1BfNDE1NjI2MzI5IiwiT1BfMTMxMTQ4MDk3IiwiT1BfMTc3NDc3NDczMSIsIk9QXzE4MjIwODE3NzIiLCJPUF83MjkxNDY4NDMiLCJPUF82MDA5MjI1NjEiLCJPUF82MjczMjEwNDUiLCJPUF8yMDkxMzM3OTIyIiwiT1BfNDc0NTk0NDAzIiwiT1BfMTk4OTk0MDM1MSIsIk9QXzM1NjI0MjY2OSIsIk9QXzM1NjA3Nzk5NSIsIk9QXzYyNTc3NDk4MyIsIk9QXzIxNzEyODM2NyIsIlJPTEVfQURNSU5JU1RSQVRPUiIsIk9QXzE1NDAwMTAyNDYiLCJPUF8xNjU3ODY0Njg2IiwiT1BfODEzNTM1MjIwIiwiT1BfOTk3ODg0MDg1IiwiT1BfMjk0MTgzNTIwIiwiT1BfNTYzMjI3MTc5IiwiT1BfMTc5NzU2ODIzNCIsIk9QXzgzNDYyODg1MCIsIk9QXzE5NzkwNjg5NzciLCJPUF8xNjU0NTEzMjYxIiwiT1BfMzIyOTQ3NTEwIiwiT1BfNzIxNDU2MDMzIiwiT1BfMTQ0NDM1NDg4IiwiT1BfNjQyMTQ1MjM4IiwiT1BfMTYxMzY5NzgwOSIsIk9QXzE0MDI5NTM1ODgiLCJPUF8xOTI0OTk4NTYzIiwiT1BfMTkwODM4MzQyNiIsIk9QXzIxMTk5NTYwNjQiXSwianRpIjoiNGJiNTQzNDUtZGQyNC00MzQ3LThkMjYtNjU1ZTVkNDA4NWY3IiwiY2xpZW50X2lkIjoiMDEwZTY1OWEtNDAwNS00NjEwLTk4ZjYtMDBiODIyZjQ3NThlIn0.BdTMSL2QTxyWe4Xs6piAS1Ldk23zUfhlG5_dA0xaNFA&quot;</span><span class="token punctuation">,</span>
    <span class="token property">&quot;token_type&quot;</span><span class="token operator">:</span> <span class="token string">&quot;bearer&quot;</span><span class="token punctuation">,</span>
    <span class="token property">&quot;refresh_token&quot;</span><span class="token operator">:</span> <span class="token string">&quot;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsaWNlbnNlIjoiaGVyb2RvdHVzLWNsb3VkIiwidXNlcl9uYW1lIjoic3lzdGVtIiwib3BlbmlkIjoiMSIsInNjb3BlIjpbImFsbCJdLCJhdGkiOiI0YmI1NDM0NS1kZDI0LTQzNDctOGQyNi02NTVlNWQ0MDg1ZjciLCJleHAiOjE2MzQyMDk3ODQsImF1dGhvcml0aWVzIjpbIk9QXzExNTk4MzkxNzUiLCJPUF8yMDY3MDA2OTYyIiwiT1BfMjAzODgxODY1IiwiT1BfMTgzMTkzMzI1NiIsIk9QXzM0NzEwODY4NCIsIk9QXzE1Mjk0OTk3MzQiLCJPUF8xNzkxNDgyODQwIiwiT1BfNTM5NzkwMTU0IiwiT1BfMTI5MTk4NjQyMCIsIk9QXzQxNDY2NTUwNSIsIk9QXzQ5MDczNzk0IiwiT1BfNzg3NjI3NTU1IiwiT1BfMTczNTYzMTgyNyIsIk9QXzEyNTYzNDY4ODciLCJPUF8xNTk1NjM4NiIsIk9QXzY1NDE2MjAxMSIsIk9QXzE2ODEwMjg3OTEiLCJPUF8xNTM4MzQzNDAiLCJPUF85NTI1NjU1NzAiLCJPUF8xOTg5ODY5MjkxIiwiT1BfMTcxODk4ODQwOCIsIk9QXzEyMTMxODc4MDkiLCJPUF85OTMxNjU1IiwiT1BfNzMwMTA1NDk5IiwiT1BfMTE5ODg3Njk4NSIsIk9QXzMyMjc3NjY4MSIsIk9QXzYyNTQ3MTI0OCIsIk9QXzIwNDA2OTk0NDMiLCJPUF83MzQwODE3MTYiLCJPUF80NTM5MjE4MjUiLCJPUF83MTUxMTUyNzIiLCJPUF82NzI5Mjg4NyIsIk9QXzE2MDM5NTM4NTgiLCJPUF8xNzQzMDQ0MzA1IiwiT1BfOTkzOTYyNDAzIiwiT1BfMTU3ODIxMTczOSIsIk9QXzI1NjIwMTkiLCJPUF8xODQwMDkwOTkyIiwiT1BfNDE1NjI2MzI5IiwiT1BfMTMxMTQ4MDk3IiwiT1BfMTc3NDc3NDczMSIsIk9QXzE4MjIwODE3NzIiLCJPUF83MjkxNDY4NDMiLCJPUF82MDA5MjI1NjEiLCJPUF82MjczMjEwNDUiLCJPUF8yMDkxMzM3OTIyIiwiT1BfNDc0NTk0NDAzIiwiT1BfMTk4OTk0MDM1MSIsIk9QXzM1NjI0MjY2OSIsIk9QXzM1NjA3Nzk5NSIsIk9QXzYyNTc3NDk4MyIsIk9QXzIxNzEyODM2NyIsIlJPTEVfQURNSU5JU1RSQVRPUiIsIk9QXzE1NDAwMTAyNDYiLCJPUF8xNjU3ODY0Njg2IiwiT1BfODEzNTM1MjIwIiwiT1BfOTk3ODg0MDg1IiwiT1BfMjk0MTgzNTIwIiwiT1BfNTYzMjI3MTc5IiwiT1BfMTc5NzU2ODIzNCIsIk9QXzgzNDYyODg1MCIsIk9QXzE5NzkwNjg5NzciLCJPUF8xNjU0NTEzMjYxIiwiT1BfMzIyOTQ3NTEwIiwiT1BfNzIxNDU2MDMzIiwiT1BfMTQ0NDM1NDg4IiwiT1BfNjQyMTQ1MjM4IiwiT1BfMTYxMzY5NzgwOSIsIk9QXzE0MDI5NTM1ODgiLCJPUF8xOTI0OTk4NTYzIiwiT1BfMTkwODM4MzQyNiIsIk9QXzIxMTk5NTYwNjQiXSwianRpIjoiOTQzYzVlOGQtNjVjZC00YmJhLTlmNjMtY2Y3MTRhNDQ2ZDdkIiwiY2xpZW50X2lkIjoiMDEwZTY1OWEtNDAwNS00NjEwLTk4ZjYtMDBiODIyZjQ3NThlIn0.JIQ7N_rqsbhSb1M9voFhbAJq9QmPoKbirZ2lV_AYkYM&quot;</span><span class="token punctuation">,</span>
    <span class="token property">&quot;expires_in&quot;</span><span class="token operator">:</span> <span class="token number">43199</span><span class="token punctuation">,</span>
    <span class="token property">&quot;scope&quot;</span><span class="token operator">:</span> <span class="token string">&quot;all&quot;</span><span class="token punctuation">,</span>
    <span class="token property">&quot;license&quot;</span><span class="token operator">:</span> <span class="token string">&quot;herodotus-cloud&quot;</span><span class="token punctuation">,</span>
    <span class="token property">&quot;openid&quot;</span><span class="token operator">:</span> <span class="token string">&quot;1&quot;</span><span class="token punctuation">,</span>
    <span class="token property">&quot;jti&quot;</span><span class="token operator">:</span> <span class="token string">&quot;4bb54345-dd24-4347-8d26-655e5d4085f7&quot;</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br></div></div><div class="custom-container tip"><p class="custom-container-title">参数</p><ul><li>access_token：访问令牌（服务器端加密过的字符串）。</li><li>refresh_token：刷新令牌（刷新令牌的字符串）</li><li>expires_in：过期时间（令牌的过期时间）</li></ul></div><h3 id="隐式模式验证" tabindex="-1"><a class="header-anchor" href="#隐式模式验证" aria-hidden="true">#</a> 隐式模式验证</h3><p>有些 Web 应用是纯前端应用，没有后端。这时就不能用上面的方式了，必须将令牌储存在前端。RFC 6749 就规定了第二种方式，允许直接向前端颁发令牌。这种方式没有授权码这个中间步骤，所以称为（授权码）&quot;隐藏式&quot;（implicit）</p><h4 id="第一步-客户端向资源端申请token" tabindex="-1"><a class="header-anchor" href="#第一步-客户端向资源端申请token" aria-hidden="true">#</a> 第一步：客户端向资源端申请Token</h4><p>在浏览器中输入如下的认证连接：</p><div class="language-url ext-url line-numbers-mode"><pre class="language-url"><code><span class="token scheme">http<span class="token scheme-delimiter">:</span></span><span class="token authority"><span class="token authority-delimiter">//</span><span class="token host">192.168.101.10</span><span class="token port-segment"><span class="token port-delimiter">:</span><span class="token port">8847</span></span></span><span class="token path"><span class="token path-separator">/</span>eurynome-cloud-uaa<span class="token path-separator">/</span>oauth<span class="token path-separator">/</span>authorize</span><span class="token query"><span class="token query-delimiter">?</span><span class="token pair"><span class="token key">response_type</span>=<span class="token value">token</span></span><span class="token pair-delimiter">&amp;</span><span class="token pair"><span class="token key">client_id</span>=<span class="token value">010e659a-4005-4610-98f6-00b822f4758e</span></span><span class="token pair-delimiter">&amp;</span><span class="token pair"><span class="token key">redirect_uri</span>=<span class="token value">http://www.baidu.com</span></span><span class="token pair-delimiter">&amp;</span><span class="token pair"><span class="token key">scope</span>=<span class="token value">all</span></span></span>
</code></pre><div class="line-numbers"><span class="line-number">1</span><br></div></div><div class="custom-container tip"><p class="custom-container-title">参数</p><ul><li>response_type：必选。值固定为“token”。</li><li>client_id：必选参数（第三方应用的标识ID，告诉服务器谁需要得到授权）</li><li>state：Client提供的一个字符串，服务器会原样返回给Client。这个要自己实现，用于防止恶意攻击。</li><li>redirect_uri：必选参数（授权成功后的重定向地址）</li><li>scope：可选参数（表示授权范围）</li></ul></div><h4 id="第二步-到认证服务器认证" tabindex="-1"><a class="header-anchor" href="#第二步-到认证服务器认证" aria-hidden="true">#</a> 第二步：到认证服务器认证</h4><p>在浏览器中输入上面的地址，会跳出如下登录界面。</p><p><img src="/eurynome-cloud/images/oauth/authorization-code-demo-01.png" alt="流程1"></p><p>输入用户名、密码和验证码进行用户验证。</p><blockquote><p>可以使用系统默认用户：system 密码：123456</p></blockquote><p>登录成功后，会跳转到授权页面进行授权，如下图所示：</p><p><img src="/eurynome-cloud/images/oauth/authorization-code-demo-02.png" alt="流程2"></p><h4 id="第三步-资源端转向客户端并传递token" tabindex="-1"><a class="header-anchor" href="#第三步-资源端转向客户端并传递token" aria-hidden="true">#</a> 第三步：资源端转向客户端并传递token</h4><p>授权成功后，就会跳转到一个新的地址，同时在地址的后面会跟随生成的token, 如下所示。这个地址就是系统中设置的 <code>redirect_uri</code></p><div class="language-url ext-url line-numbers-mode"><pre class="language-url"><code><span class="token scheme">https<span class="token scheme-delimiter">:</span></span><span class="token authority"><span class="token authority-delimiter">//</span><span class="token host">www.baidu.com</span></span><span class="token path"><span class="token path-separator">/</span></span><span class="token fragment"><span class="token fragment-delimiter">#</span>access_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsaWNlbnNlIjoiaGVyb2RvdHVzLWNsb3VkIiwidXNlcl9uYW1lIjoic3lzdGVtIiwib3BlbmlkIjoiMSIsInNjb3BlIjpbImFsbCJdLCJleHAiOjE2MzE2NjA5ODQsImF1dGhvcml0aWVzIjpbIk9QXzExNTk4MzkxNzUiLCJPUF8yMDY3MDA2OTYyIiwiT1BfMjAzODgxODY1IiwiT1BfMTgzMTkzMzI1NiIsIk9QXzM0NzEwODY4NCIsIk9QXzE1Mjk0OTk3MzQiLCJPUF8xNzkxNDgyODQwIiwiT1BfNTM5NzkwMTU0IiwiT1BfMTI5MTk4NjQyMCIsIk9QXzQxNDY2NTUwNSIsIk9QXzQ5MDczNzk0IiwiT1BfNzg3NjI3NTU1IiwiT1BfMTczNTYzMTgyNyIsIk9QXzEyNTYzNDY4ODciLCJPUF8xNTk1NjM4NiIsIk9QXzY1NDE2MjAxMSIsIk9QXzE2ODEwMjg3OTEiLCJPUF8xNTM4MzQzNDAiLCJPUF85NTI1NjU1NzAiLCJPUF8xOTg5ODY5MjkxIiwiT1BfMTcxODk4ODQwOCIsIk9QXzEyMTMxODc4MDkiLCJPUF85OTMxNjU1IiwiT1BfNzMwMTA1NDk5IiwiT1BfMTE5ODg3Njk4NSIsIk9QXzMyMjc3NjY4MSIsIk9QXzYyNTQ3MTI0OCIsIk9QXzIwNDA2OTk0NDMiLCJPUF83MzQwODE3MTYiLCJPUF80NTM5MjE4MjUiLCJPUF83MTUxMTUyNzIiLCJPUF82NzI5Mjg4NyIsIk9QXzE2MDM5NTM4NTgiLCJPUF8xNzQzMDQ0MzA1IiwiT1BfOTkzOTYyNDAzIiwiT1BfMTU3ODIxMTczOSIsIk9QXzI1NjIwMTkiLCJPUF8xODQwMDkwOTkyIiwiT1BfNDE1NjI2MzI5IiwiT1BfMTMxMTQ4MDk3IiwiT1BfMTc3NDc3NDczMSIsIk9QXzE4MjIwODE3NzIiLCJPUF83MjkxNDY4NDMiLCJPUF82MDA5MjI1NjEiLCJPUF82MjczMjEwNDUiLCJPUF8yMDkxMzM3OTIyIiwiT1BfNDc0NTk0NDAzIiwiT1BfMTk4OTk0MDM1MSIsIk9QXzM1NjI0MjY2OSIsIk9QXzM1NjA3Nzk5NSIsIk9QXzYyNTc3NDk4MyIsIk9QXzIxNzEyODM2NyIsIlJPTEVfQURNSU5JU1RSQVRPUiIsIk9QXzE1NDAwMTAyNDYiLCJPUF8xNjU3ODY0Njg2IiwiT1BfODEzNTM1MjIwIiwiT1BfOTk3ODg0MDg1IiwiT1BfMjk0MTgzNTIwIiwiT1BfNTYzMjI3MTc5IiwiT1BfMTc5NzU2ODIzNCIsIk9QXzgzNDYyODg1MCIsIk9QXzE5NzkwNjg5NzciLCJPUF8xNjU0NTEzMjYxIiwiT1BfMzIyOTQ3NTEwIiwiT1BfNzIxNDU2MDMzIiwiT1BfMTQ0NDM1NDg4IiwiT1BfNjQyMTQ1MjM4IiwiT1BfMTYxMzY5NzgwOSIsIk9QXzE0MDI5NTM1ODgiLCJPUF8xOTI0OTk4NTYzIiwiT1BfMTkwODM4MzQyNiIsIk9QXzIxMTk5NTYwNjQiXSwianRpIjoiNGJiNTQzNDUtZGQyNC00MzQ3LThkMjYtNjU1ZTVkNDA4NWY3IiwiY2xpZW50X2lkIjoiMDEwZTY1OWEtNDAwNS00NjEwLTk4ZjYtMDBiODIyZjQ3NThlIn0.BdTMSL2QTxyWe4Xs6piAS1Ldk23zUfhlG5_dA0xaNFA&amp;token_type=bearer&amp;expires_in=42511&amp;license=herodotus-cloud&amp;openid=1&amp;jti=4bb54345-dd24-4347-8d26-655e5d4085f7</span>
</code></pre><div class="line-numbers"><span class="line-number">1</span><br></div></div><blockquote><p>上面 URL 中，access_token参数就是令牌</p></blockquote><h3 id="密码模式验证" tabindex="-1"><a class="header-anchor" href="#密码模式验证" aria-hidden="true">#</a> 密码模式验证</h3><p>如果你高度信任某个应用，RFC 6749 也允许用户把用户名和密码，直接告诉该应用。该应用就使用你的密码，申请令牌，这种方式称为&quot;密码式&quot;（password）。</p><blockquote><p>Eurynome Cloud 前端就是使用密码模式进行登录</p></blockquote><p>直接使用如下地址获取Token即可</p><div class="language-url ext-url line-numbers-mode"><pre class="language-url"><code><span class="token scheme">http<span class="token scheme-delimiter">:</span></span><span class="token authority"><span class="token authority-delimiter">//</span><span class="token host">192.168.101.10</span><span class="token port-segment"><span class="token port-delimiter">:</span><span class="token port">8847</span></span></span><span class="token path"><span class="token path-separator">/</span>eurynome-cloud-uaa<span class="token path-separator">/</span>oauth<span class="token path-separator">/</span>token</span>
</code></pre><div class="line-numbers"><span class="line-number">1</span><br></div></div><p>操作如下图所示：</p><p><img src="/eurynome-cloud/images/oauth/authorization-code-demo-04.png" alt="流程4"></p><div class="custom-container tip"><p class="custom-container-title">参数</p><ul><li>username：必选参数（登录用户名）</li><li>password：必选参数（登录用户密码）</li><li>grant_type：必选参数（固定值“password”）</li><li>client_id：必选参数</li><li>client_secret：必选参数</li><li>scope：可选参数（表示授权范围）</li></ul></div><h3 id="客户端凭证模式验证" tabindex="-1"><a class="header-anchor" href="#客户端凭证模式验证" aria-hidden="true">#</a> 客户端凭证模式验证</h3><p>这种模式直接根据client的id和密钥即可获取token，无需用户参与 这种模式比较合适消费api的后端服务，比如拉取一组用户信息等</p><p>直接使用如下地址获取Token即可</p><div class="language-url ext-url line-numbers-mode"><pre class="language-url"><code><span class="token scheme">http<span class="token scheme-delimiter">:</span></span><span class="token authority"><span class="token authority-delimiter">//</span><span class="token host">192.168.101.10</span><span class="token port-segment"><span class="token port-delimiter">:</span><span class="token port">8847</span></span></span><span class="token path"><span class="token path-separator">/</span>eurynome-cloud-uaa<span class="token path-separator">/</span>oauth<span class="token path-separator">/</span>token</span>
</code></pre><div class="line-numbers"><span class="line-number">1</span><br></div></div><p>操作如下图所示：</p><p><img src="/eurynome-cloud/images/oauth/authorization-code-demo-05.png" alt="流程5"></p><div class="custom-container tip"><p class="custom-container-title">参数</p><ul><li>grant_type：必选参数（固定值“client_credentials”）</li><li>client_id：必选参数</li><li>client_secret：必选参数</li><li>scope：可选参数（表示授权范围）</li></ul></div><!--]--></div><footer class="page-meta"><!----><div class="meta-item last-updated"><span class="meta-item-label">更新时间: </span><span class="meta-item-info">2021/9/18 上午12:47:54</span></div><div class="meta-item contributors"><span class="meta-item-label">贡献者: </span><span class="meta-item-info"><!--[--><!--[--><span class="contributor" title="email: pointer_v@qq.com">herodotus</span><!----><!--]--><!--]--></span></div></footer><nav class="page-nav"><p class="inner"><span class="prev"> ← <a href="/eurynome-cloud/microservices/" class="nav-link router-link-active" aria-label="介绍"><!--[--><!--]--> 介绍 <!--[--><!--]--></a></span><span class="next"><a href="/eurynome-cloud/microservices/%E5%AE%B9%E5%99%A8%E5%8C%96%E6%8A%80%E6%9C%AF.html" class="nav-link" aria-label="容器化技术"><!--[--><!--]--> 容器化技术 <!--[--><!--]--></a> → </span></p></nav><!--[--><!--]--></main><!--]--></div><!----><!----><!--]--></div>
    <script src="/eurynome-cloud/assets/js/runtime~app.be772053.js" defer></script><script src="/eurynome-cloud/assets/js/287.4d31e5fd.js" defer></script><script src="/eurynome-cloud/assets/js/app.c0fb808e.js" defer></script>
  </body>
</html>
